package cn.com.blueInfo.bpm.person.service.impl;

import cn.com.blueInfo.bpm.person.convert.UserUnionConvert;
import cn.com.blueInfo.bpm.person.entity.UserUnion;
import cn.com.blueInfo.bpm.person.repository.UserUnionRepository;
import cn.com.blueInfo.bpm.person.request.UserUnionDTO;
import cn.com.blueInfo.bpm.person.response.UserUnionVO;
import cn.com.blueInfo.bpm.person.service.UserUnionService;
import cn.com.blueInfo.core.util.SnowflakeIdGenerator;
import cn.com.blueInfo.utils.result.ResultInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 员工联合信息表 业务服务实现类
 * @author suxch
 * @since 2025-09-01 19:28:09
 */
@Log4j2
@Service
public class UserUnionServiceImpl implements UserUnionService {

    @Autowired
    private UserUnionRepository userUnionRepository;

    @Autowired
    private SnowflakeIdGenerator snowflakeIdGenerator;

    @Autowired
    private UserUnionConvert userUnionConvert;

    /**
     * 新增员工联合信息
     * @param userUnionDTO 员工联合信息参数
     */
    @Override
    public ResultInfo<Integer> addUserUnion(UserUnionDTO userUnionDTO) {
        UserUnion userUnion = userUnionConvert.dtoToEntity(userUnionDTO);
        userUnion.setId(snowflakeIdGenerator.nextId());
        Integer addSize = userUnionRepository.createUserUnion(userUnion);
        return ResultInfo.<Integer>builder().data(addSize).message("员工联合信息成功新增 {} 条").build();
    }

    /**
     * 批量新增员工联合信息
     * @param userUnionDTOList 员工联合信息参数列表
     */
    @Override
    public ResultInfo<Integer> batchAddUserUnion(List<UserUnionDTO> userUnionDTOList) {
        List<UserUnion> userUnionList = userUnionConvert.dtoToEntity(userUnionDTOList);
        for (UserUnion userUnion : userUnionList) userUnion.setId(snowflakeIdGenerator.nextId());
        Integer addSize = userUnionRepository.batchCreateUserUnion(userUnionList);
        return ResultInfo.<Integer>builder().data(addSize).message("员工联合信息成功新增 {} 条").build();
    }

    /**
     * 删除员工联合信息
     * @param userUnionId 员工联合信息ID
     */
    @Override
    public ResultInfo<Integer> removeUserUnion(Long userUnionId) {
        Integer removeSize = userUnionRepository.deleteUserUnion(userUnionId);
        return ResultInfo.<Integer>builder().data(removeSize).message("员工联合信息成功删除 {} 条").build();
    }

    /**
     * 批量删除员工联合信息
     * @param userUnionIdList 员工联合信息ID列表
     */
    @Override
    public ResultInfo<Integer> batchRemoveUserUnion(List<Long> userUnionIdList) {
        Integer removeSize = userUnionRepository.batchDeleteUserUnion(userUnionIdList);
        return ResultInfo.<Integer>builder().data(removeSize).message("员工联合信息成功删除 {} 条").build();
    }

    /**
     * 更新部分员工联合信息
     * @param userUnionUpdatePartialDTO 员工联合信息参数
     */
    @Override
    public ResultInfo<Integer> modifyUserUnionPartial(UserUnionDTO.UpdatePartialDTO userUnionUpdatePartialDTO) {
        UserUnion userUnion = userUnionConvert.dtoToEntity(userUnionUpdatePartialDTO);
        Integer modifySize = userUnionRepository.updateUserUnionPartial(userUnion);
        return ResultInfo.<Integer>builder().data(modifySize).message("员工联合信息成功更新 {} 条").build();
    }

    /**
     * 更新全部员工联合信息
     * @param userUnionDTO 员工联合信息参数
     */
    @Override
    public ResultInfo<Integer> modifyUserUnion(UserUnionDTO userUnionDTO) {
        UserUnion userUnion = userUnionConvert.dtoToEntity(userUnionDTO);
        Integer modifySize = userUnionRepository.updateUserUnion(userUnion);
        return ResultInfo.<Integer>builder().data(modifySize).message("员工联合信息成功更新 {} 条").build();
    }

    /**
     * 查询一条员工联合信息
     * @param userUnionId 员工联合信息ID
     */
    @Override
    public ResultInfo<UserUnionVO> queryUserUnionById(Long userUnionId) {
        UserUnion userUnion = userUnionRepository.getUserUnionById(userUnionId);
        UserUnionVO userUnionVO = userUnionConvert.entityToVO(userUnion);
        return ResultInfo.<UserUnionVO>builder().data(userUnionVO).message("员工联合信息查询成功").build();
    }

    /**
     * 分页查询员工联合信息
     * @param userUnionQueryDTO 员工联合信息参数
     */
    @Override
    public ResultInfo<Page<UserUnionVO>> queryUserUnionPage(UserUnionDTO.QueryDTO userUnionQueryDTO) {
        Page<UserUnion> userUnionPage = userUnionRepository.getUserUnionPage(userUnionQueryDTO);
        Page<UserUnionVO> resultData = userUnionConvert.convertPage(userUnionPage);
        return ResultInfo.<Page<UserUnionVO>>builder()
                .data(resultData)
                .message("员工联合信息分页查询成功，共 {} 条", resultData.getRecords().size())
                .build();
    }

    /**
     * 根据条件查询 员工联合信息 数量
     * @param userUnionQueryDTO 员工联合信息参数
     */
    @Override
    public ResultInfo<Long> queryUserUnionCount(UserUnionDTO.QueryDTO userUnionQueryDTO) {
        Long resultCount = userUnionRepository.getUserUnionCount(userUnionQueryDTO);
        return ResultInfo.<Long>builder()
                .data(resultCount)
                .message("员工联合信息数量查询成功，共 {} 条", resultCount)
                .build();
    }

    /**
     * 根据条件查询 员工联合信息
     * @param userUnionQueryDTO 员工联合信息参数
     */
    @Override
    public ResultInfo<List<UserUnionVO>> queryUserUnionList(UserUnionDTO.QueryDTO userUnionQueryDTO) {
        List<UserUnion> userUnionList = userUnionRepository.getUserUnionList(userUnionQueryDTO);
        List<UserUnionVO> resultData = userUnionConvert.entityListToVoList(userUnionList);
        return ResultInfo.<List<UserUnionVO>>builder()
                .data(resultData)
                .message("员工联合信息分页查询成功，共 {} 条", resultData.size())
                .build();
    }
}
